package models

import (
	"github.com/fatih/structs"
	"log"
	"quantization_trading/src/util"
)

type Order struct {
	Id int `json:"id"`
	Cid string `json:"cid" structs:"cid"`	//用户自定义id
	//ParentId string `json:"parent_id" structs:"parent_id"`	//平仓单对应的开仓用户id 如果是"-1"就开仓单
	AccountName string `json:"account_name" structs:"account_name"`	//用户名
	ExecutedQty float64 `json:"executed_qty" structs:"executed_qty"` // 成交量
	OrderId string `json:"order_id" structs:"order_id"` // 系统订单号
	AvgPrice float64 `json:"avg_price" structs:"avg_price"`// 平均成交价
	OrigQty float64 `json:"orig_qty" structs:"orig_qty"` // 原始委托数量
	Price float64 `json:"price" structs:"price"` // 委托价格
	OType int `json:"o_type" structs:"o_type"`//1：开多 2：开空 3：平多 4： 平空
	Type int `json:"type" structs:"type"`	//1:限价 2:市场价；触发价格类型，默认是限价；为市场价时，委托价格不必填；T
	Status int `json:"status" structs:"status"`// 订单状态
	StatusUse bool `json:"status_use" structs:"status_use"` //订单是否还在使用（在使用就放缓存）
	Symbol string `json:"symbol" structs:"symbol"` // 交易对
	UpdateTime int64 `json:"update_time" structs:"update_time"` //更新时间
}

func (Order)TableName() string {
	return "order"
}

func AddOrder(order *Order) int {
	if err := db.Create(order).Error; err != nil {
		log.Fatal(err)
		return util.ADD_ERROR
	}else {
		return util.ADD_SUSSESS
	}
}

//更新订单
func UpdateOrder(order *Order) int {
	orderMap := structs.Map(order)
	err := db.Model(Order{}).Where("cid= ?", order.Cid).Updates(orderMap).Error
	if err!=nil{
		return util.UPDATE_ERROR
	}
	//db.Delete(order)
	return util.UPDATE_SUSSESS
}
//更新订单
func UpdateOrder2(oOrder,nOrder *Order) int {
	nOrderMap := structs.Map(nOrder)
	delete(nOrderMap, "Id")
	oOrderMap := structs.Map(oOrder)
	delete(oOrderMap, "Id")
	if !util.CompareTwoMapInterface(nOrderMap,oOrderMap){
		err := db.Model(Order{}).Where("cid= ?", oOrder.Cid).Updates(nOrderMap).Error
		if err!=nil{
			return util.UPDATE_ERROR
		}
	}

	//db.Delete(order)
	return util.UPDATE_SUSSESS
}



func FindOrder(cid string) *Order {
	var or Order
	err := db.Where("cid = ?",cid).First(&or).Error
	if err != nil {
		return nil
	}else {
		return &or
	}
}
//func FindSubOrder(parent_id string) *Order {
//	var or Order
//	err := db.Where("parent_id = ?",parent_id).First(&or).Error
//	if err != nil {
//		return nil
//	}
//	return &or
//}

func FindAllUseOrder(accountName string) ([]Order, error) {
	var order_list []Order
	err :=db.Where("status_use = ? and account_name = ?", true,accountName).Find(&order_list).Error
	return order_list,err
}

func FindAllOrder() ([]Order, error) {
	var order_list []Order
	db.Find(&order_list)
	return order_list,nil
}

